# -*- coding: utf-8 -*-
"""
Created on Thu May 15 14:13:22 2025

@author: tianr
"""

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import time
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, fpgrowth, association_rules
import psutil

# 添加中文字体设置
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 设置微软雅黑字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 定义商品类别映射
category_mapping = {
    '智能手机': '电子产品', '笔记本电脑': '电子产品', '平板电脑': '电子产品',
    '智能手表': '电子产品', '耳机': '电子产品', '音响': '电子产品',
    '相机': '电子产品', '摄像机': '电子产品', '游戏机': '电子产品',
    '上衣': '服装', '裤子': '服装', '裙子': '服装', '内衣': '服装',
    '鞋子': '服装', '帽子': '服装', '手套': '服装', '围巾': '服装',
    '外套': '服装', '零食': '食品', '饮料': '食品', '调味品': '食品',
    '米面': '食品', '水产': '食品', '肉类': '食品', '蛋奶': '食品',
    '水果': '食品', '蔬菜': '食品', '家具': '家居', '床上用品': '家居',
    '厨具': '家居', '卫浴用品': '家居', '文具': '办公', '办公用品': '办公',
    '健身器材': '运动户外', '户外装备': '运动户外', '玩具': '玩具',
    '模型': '玩具', '益智玩具': '玩具', '婴儿用品': '母婴',
    '儿童课外读物': '母婴', '车载电子': '汽车用品', '汽车装饰': '汽车用品'
}

def get_memory_usage():
    """获取当前内存使用情况（GB）"""
    process = psutil.Process()
    return process.memory_info().rss / 1e9

# 记录内存使用
memory_usage = []
times = []

start_time = time.time()
memory_usage.append(get_memory_usage())
times.append(time.time() - start_time)


purchased_history = pd.read_csv('D:/DTR/MyWork/2025/DataMining/personalProject/output/items_10G_one.csv')
product = pd.read_csv('D:/DTR/MyWork/2025/DataMining/personalProject/output/product.csv')


memory_usage.append(get_memory_usage())
times.append(time.time() - start_time)
print(f"数据读取完成，内存使用: {memory_usage[-1]:.2f} GB")

# 处理items列（将字符串转换为列表）
print("处理数据中...")
purchased_history['items'] = purchased_history['items'].apply(lambda x: eval(x))

# 二、支付方式与商品类别的关联分析
# 1. 准备数据
# 合并purchased_history和product，获取每个订单中商品的类别和价格信息
merged_product = purchased_history.explode('items').merge(product, left_on='items', right_on='id', how='left')


# 将商品类别进行映射
merged_product['category'] = merged_product['category'].map(category_mapping)

# 按订单号和支付方式分组，统计每个订单中的商品类别和总金额
order_summary = merged_product.groupby(['purchase_date', 'payment_method']).agg(
    categories=('category', lambda x: list(set(x))),  # 去重的商品类别列表
    total_price=('price', 'sum')  # 订单总金额
).reset_index()

# 2. 支付方式与商品类别的关联规则挖掘
# 将数据转换为适合关联规则挖掘的格式
transactions_payment = order_summary.apply(
    lambda row: [row['payment_method']] + row['categories'], axis=1).tolist()

# 编码事务数据
te_payment = TransactionEncoder()
te_ary_payment = te_payment.fit(transactions_payment).transform(transactions_payment)
df_payment = pd.DataFrame(te_ary_payment, columns=te_payment.columns_)

# 使用Apriori算法找到频繁项集
frequent_itemsets_payment = apriori(df_payment, min_support=0.01, use_colnames=True)



# 从频繁项集中找到关联规则，筛选出前件为支付方式，后件为商品类别的规则
rules_payment = association_rules(frequent_itemsets_payment, metric="confidence", min_threshold=0.0)
payment_to_category_rules = rules_payment[
    rules_payment['antecedents'].apply(lambda x: len(x) == 1 and next(iter(x)) in purchased_history['payment_method'].unique()) &
    rules_payment['consequents'].apply(lambda x: len(x) == 1 and next(iter(x)) not in purchased_history['payment_method'].unique())
]
csv_path = 'C:/Users/tianr/OneDrive/Desktop/数据挖掘/互评作业2/2.支付方式与商品类别的关联分析/frequent_itemsets_payment.csv'
rules_payment.to_csv(csv_path, index=False)


# 3. 分析高价值商品（价格 > 5000）的首选支付方式
# 筛选出包含高价值商品的订单
high_value_orders = merged_product[merged_product['price'] > 5000]

# 统计每种支付方式在高价值订单中的使用频率
payment_method_counts = high_value_orders['payment_method'].value_counts().reset_index()
payment_method_counts.columns = ['payment_method', 'count']
payment_method_counts['percentage'] = payment_method_counts['count'] / payment_method_counts['count'].sum() * 100

# 找出高价值订单中最常用的支付方式
top_payment_method = payment_method_counts.loc[payment_method_counts['count'].idxmax()]

print('支持度 ≥ 0.01、置信度 ≥ 0.6的支付方式与商品类别关联规则：')
print(payment_to_category_rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
print('\n高价值商品（价格 > 5000）的支付方式分布：')
print(payment_method_counts)
print(f"\n高价值商品的首选支付方式：{top_payment_method['payment_method']}，占比{top_payment_method['percentage']:.2f}%")
